﻿using System;
using System.Linq;
using System.Collections.Generic;
using SIM.Geo.DA;
using SIM.Geo.BE;
using System.Transactions;

namespace SIM.Geo.BL
{
    public class BLEstructura
    {
        /// <summary>
        /// Devuelve la lista de Estructuras
        /// </summary>
        /// <returns></returns>
        public List<Estructura> ListarEstructura()
        {
            return Accesor.ListarEstructura();
        }

        /// <summary>
        /// Devuelve la lista de Estructuras por Sondaje
        /// </summary>
        /// <returns></returns>
        public List<Estructura> BuscarEstructuraPorSondaje(int codigoSondaje)
        {
            return Accesor.BuscarEstructuraPorSondaje(codigoSondaje);
        }

        /// <summary>
        /// Registra nuevo Estructura
        /// </summary>
        /// <param name="Estructura"></param>
        /// <returns></returns>
        public string InsertarEstructura(Estructura estructura)
        {
            string result = "Registrado";

            int EsPermitidoLaDistancia = new DASondaje().ValidarDistanciaSondaje(estructura.CodigoSondaje, estructura.Hasta);
            if (EsPermitidoLaDistancia != 0)
            {
                result = "No se puede registrar. Está fuera de rango de la Distancia de Sondaje.";
                return result;
            }

            using (TransactionScope transaction = new TransactionScope())
            {
                estructura.CodigoEstructura = Accesor.GenerarCodigoEstructura(estructura.CodigoSondaje);
                Accesor.InsertarEstructura(estructura);
                transaction.Complete();
            }
            return result;
        }

        /// <summary>
        /// Modifica un Estructura
        /// </summary>
        /// <param name="Estructura"></param>
        public string ModificarEstructura(Estructura estructura)
        {
            string result = "Registrado";

            int EsPermitidoLaDistancia = new DASondaje().ValidarDistanciaSondaje(estructura.CodigoSondaje, estructura.Hasta);
            if (EsPermitidoLaDistancia != 0)
            {
                result = "No se puede registrar. Está fuera de rango de la Distancia de Sondaje.";
                return result;
            }

            using (TransactionScope transaction = new TransactionScope())
            {
                //Primero elimino los detalles
                DAEstructuraTipoEstructuraTipoRelleno dAEstructuraTipoEstructuraTipoRelleno = new DAEstructuraTipoEstructuraTipoRelleno();
                List<EstructuraTipoRelleno> listaTipoRelleno = dAEstructuraTipoEstructuraTipoRelleno.ListarEstructuraTipoRelleno(estructura.CodigoSondaje, estructura.CodigoEstructura);
                foreach (var item in listaTipoRelleno)
                {
                    dAEstructuraTipoEstructuraTipoRelleno.EliminarEstructuraTipoRelleno(item);
                }

                var estructuraEdit = Accesor.ObtenerEstructura(estructura.CodigoSondaje, estructura.CodigoEstructura);
                estructuraEdit.Desde = estructura.Desde;
                estructuraEdit.Hasta = estructura.Hasta;
                estructuraEdit.CodigoGeologo = estructura.CodigoGeologo;
                estructuraEdit.Fecha = estructura.Fecha;
                estructuraEdit.CodigoTipoEstructura = estructura.CodigoTipoEstructura;                
                estructuraEdit.Angulo = estructura.Angulo;
                estructuraEdit.Descripcion = estructura.Descripcion;
                estructuraEdit.EstructuraTipoRelleno = estructura.EstructuraTipoRelleno;

                Accesor.ModificarEstructura(estructuraEdit);

                transaction.Complete();
            }
            return result;
        }

        /// <summary>
        /// Eliminar un Estructura
        /// </summary>
        /// <param name="Estructura"></param>
        public void EliminarEstructura(int codigoSondaje, int codigoEstructura)
        {
            using (TransactionScope transaction = new TransactionScope())
            {
                var estructura = Accesor.ObtenerEstructura(codigoSondaje, codigoEstructura);
                DAEstructuraTipoEstructuraTipoRelleno dAEstructuraTipoEstructuraTipoRelleno = new DAEstructuraTipoEstructuraTipoRelleno();
                List<EstructuraTipoRelleno> listaTipoRelleno = dAEstructuraTipoEstructuraTipoRelleno.ListarEstructuraTipoRelleno(estructura.CodigoSondaje, estructura.CodigoEstructura);

                foreach (var item in listaTipoRelleno)
                {
                    dAEstructuraTipoEstructuraTipoRelleno.EliminarEstructuraTipoRelleno(item);
                }

                Accesor.EliminarEstructura(estructura);
                transaction.Complete();
            }

        }

        /// <summary>
        /// Obtiene un Estructura
        /// </summary>
        /// <param name="codigoEstructura"></param>
        /// <returns></returns>
        public Estructura ObtenerEstructura(int codigoSondaje, int codigoEstructura)
        {
            var estructura= Accesor.ObtenerEstructura(codigoSondaje, codigoEstructura);
            ///se obtiene el detalle de tipo relleno para la estructura
            if(estructura!=null){
               estructura.EstructuraTipoRelleno= AccesorETR.ListarEstructuraTipoRelleno(codigoSondaje, codigoEstructura);
            }

            return estructura;

        }

        /// <summary>
        /// Genera correlativo de Litologia por Sondaje
        /// </summary>
        /// <param name="codigoSondaje"></param>
        /// <returns></returns>
        public int GenerarCodigoEstructura(int codigoSondaje)
        {
            return Accesor.GenerarCodigoEstructura(codigoSondaje);
        }

        /// <summary>
        /// Devuelve la lista de Estructuras por Sondaje
        /// </summary>
        /// <returns></returns>
        public List<buscarEstructura_Result> BuscarEstructuraPorSondaje1(int codigoSondaje)
        {
            return Accesor.BuscarEstructuraPorSondaje1(codigoSondaje);
        }

        #region Accesor
        private static DAEstructura Accesor
        {
            [System.Diagnostics.DebuggerStepThrough]
            get { return new DAEstructura(); }
        }
        #endregion Accesor

        #region Accesor EstructuraTipoRelleno
        private static  DAEstructuraTipoEstructuraTipoRelleno AccesorETR
        {
            [System.Diagnostics.DebuggerStepThrough]
            get { return new DAEstructuraTipoEstructuraTipoRelleno(); }
        }
        #endregion Accesor EstructuraTipoRelleno
        /// <summary>
        /// Validar Interseccion
        /// </summary>
        /// <param name="codigoSondaje"></param>
        /// <param name="tipoAnalisis"></param>
        /// <param name="desde"></param>
        /// <param name="hasta"></param>
        /// <returns></returns>
        public int ValidarInterseccionEstructura(int codigoSondaje, int codigoEstructura, double desde, double hasta)
        {
            return Accesor.ValidarInterseccionEstructura(codigoSondaje, codigoEstructura, desde, hasta);
        }

        /// <summary>
        /// Devuelve el ultimo Hasta
        /// </summary>
        /// <param name="codigoSondaje"></param>
        /// <returns></returns>
        public double ObtenerUltimoHasta(int codigoSondaje)
        {
            return Accesor.ObtenerUltimoHasta(codigoSondaje);
        }
    }
}
